import os
import subprocess


class AudioMergerWithSilence:
    """
    音频合并工具类：将文件夹中的音频文件按顺序合并，
    并在每个音频之间插入指定时长的静音。
    使用 ffmpeg 实现。
    """

    def __init__(self, input_folder=None, output_file=None, silence_duration=1.0):
        """
        初始化音频合并器

        Args:
            input_folder (str): 音频文件夹路径
            output_file (str): 输出文件路径（例如 merged.wav）
            silence_duration (float): 静音时长（秒）
        """
        self.input_folder = input_folder
        self.output_file = output_file
        self.silence_duration = silence_duration

    # ===== Setter 方法 =====
    def set_input_folder(self, input_folder: str):
        """设置音频输入文件夹"""
        self.input_folder = input_folder

    def set_output_file(self, output_file: str):
        """设置输出音频文件路径"""
        self.output_file = output_file

    def set_silence_duration(self, duration: float):
        """设置插入静音时长（秒）"""
        self.silence_duration = duration

    # ===== 主功能函数 =====
    def merge(self):
        """执行音频合并操作"""
        if not all([self.input_folder, self.output_file]):
            raise ValueError("请先设置 input_folder 和 output_file。")

        # 获取所有音频文件
        files = sorted([
            os.path.join(self.input_folder, f)
            for f in os.listdir(self.input_folder)
            if f.lower().endswith(('.wav', '.mp3', '.flac'))
        ])

        if not files:
            print("❌ 未找到音频文件。")
            return

        # 临时文件路径
        temp_list_file = os.path.join(self.input_folder, "file_list.txt")
        silence_file = os.path.join(self.input_folder, "silence.wav")

        print(f"🎧 检测到 {len(files)} 个音频文件，正在生成静音文件...")

        # 生成静音文件
        subprocess.run([
            "ffmpeg", "-y", "-f", "lavfi",
            "-i", "anullsrc=r=44100:cl=mono",
            "-t", str(self.silence_duration),
            silence_file
        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)

        # 写入 ffmpeg concat 列表
        with open(temp_list_file, "w", encoding="utf-8") as f:
            for i, file in enumerate(files):
                f.write(f"file '{file}'\n")
                if i < len(files) - 1:
                    f.write(f"file '{silence_file}'\n")

        print("🌀 正在合并音频，请稍候...")

        # 执行合并
        subprocess.run([
            "ffmpeg", "-y", "-f", "concat", "-safe", "0",
            "-i", temp_list_file, "-c", "copy", self.output_file
        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)

        # 删除临时文件
        os.remove(temp_list_file)
        os.remove(silence_file)

        print(f"✅ 合并完成！输出文件：{self.output_file}")

# ============ 使用示例 ============
if __name__ == "__main__":
    merger = AudioMergerWithSilence(
        input_folder=r"C:\Users\33720\Desktop\temp\tts",
        output_file=r"C:\Users\33720\Desktop\all.wav",
        silence_duration=0.8
    )

    # 可以动态修改参数
    # merger.set_silence_duration(1.2)
    # merger.set_output_file(r"C:\Users\33720\Desktop\merged.wav")

    merger.merge()
